var async = require('async');
//商品有关的模型
var ProM = require('../models/product');
var UserCollectM = require('../models/collect');
var Comment = require('../models/evaluation');
var CartM = require('../models/cart');
//分类有关的模型
var ClzM = require('../models/classify');
var log4js = require('log4js');
var logger = log4js.getLogger('normal');
var commonM = require('../models/common');

module.exports = {
    /**
     * 需要在url中传递商品的ID
     * @param req
     * @param res
     * @param next
     */
    getById : function(req, res, next){
        //业务操作
        var objectId = req.params.id;
       // console.log(objectId);
        ProM.get(objectId).then(function(product){
//            console.log(product);
            res.render('p/demo',{title:'商品详情',product:product});
        }).catch(function(err){
            //TODO:错误的处理
            res.error(err);
        });
    },
    /**
     * 需要在url中传入分类的类目名称和页码
     * cname
     * page
     * @param req
     * @param res
     * @param next
     */
    listByClass:function(req,res,next){
        //获取分类的简码
        var cname = req.params.cname;
        //获取页码
        var page = req.params.p;

        //js nodejs
        //魔鬼金字塔
        // find(function(){
                //find(function(){
                    //find();
                // });
        // })
        //waterfall 水流代码 ，保证 函数列表已传入的顺序严格执行
        //且，可以通过回掉，将前面的执行结果传递给后面的函数
        //函数出现异常

        async.waterfall([

            //通过cname获取cid

            function(callback){
                ClzM.getByName(cname).then(function(clz){
                    callback(null,clz);
                });
            },
            //通过cid获取商品列表
            //clz 指向前面一个函数的输出值
            function(clz,callback){
                ProM.list(clz.id,page).then(function(list){
                    callback(null,{classify:clz,list:list});
                }).catch(function(err){
                    //TODO:错误的处理
                });
            }

        ],function(err,result){
            if(err){
                //TODO:
                return;
            }
            //res.send('111');//直接把内容输出给浏览器

            res.render('p/list',{title:result.classify.get('intro'),list:result.list});
        });

    },
    /**
     * 商品详情页，需要在URL中传入商品id
     * Created by Nicolas at 2015-08-19
     * @param req
     * @param res
     * @param next
     */
    //商品详情
    getDetailById : function(req, res, next){
        var objectId = req.params.id;
        var userid= req.AV.user.id;
        async.auto({
            //通过商品objectid和用户id获取是否收藏
            isCollect:function(callback){
                UserCollectM.isUserCollectByUid(userid,objectId).then(function(collect){
                    var isCollected = collect.flag;
                    callback(null,isCollected);
                }).catch(function(err){
                    //TODO:错误的处理
                });
            },
            //判断是否参与活动
            isActivity:function(callback){
                ProM.checkIsSeckill(objectId).then(function(seckill){
                    callback(null,seckill);
                }).catch(function(err){
                    //TODO:错误的处理
                    callback(err);
                });
            },
            //获取购物车内的商品数量（number总数）
            getCountOfCart:function(callback){
                CartM.getAllCountOfCart(userid).then(function(cartNumber){
                    callback(null, cartNumber);
                }).catch(function(err){
                    //TODO:错误的处理
                    callback(err);
                });
            },
            //判断商品是否下架
            isOnSale:function(callback){
                ProM.isOnSale(objectId).then(function(info){
                    var isOnSale = true;
                    if(info.code===0){
                        isOnSale=info.isOnSale;
                    }
                    callback(null, isOnSale);
                });
            },
            //通过objectid获取商品详细信息
            getProDetail:function(callback){
                ProM.getProDetailByObjId(objectId).then(function(product){
                    //将picurlarray转换成JSON格式  (将json转换为string：json.stringify)
                    var picurlarray=JSON.parse(product.get('picurlarray'));
                    //获取规格
                    var spec=product.get('spec');
                    //console.log(JSON.parse(product.get('spec')));
                    //获取图文详情（使用正则表达式）
                    var directPic = product.get('content');
                    var imgReg = /<img.*?(?:>|\/>)/gi;
                    var srcReg = /src=[\'\"]?([^\'\"]*)[\'\"]?/i;
                    var arr = directPic.match(imgReg);
                    if(!arr || arr.length<1){
                        directPic=[];
                    }else{
                        for ( var i=0;i<arr.length;i++){
                            var s = srcReg.exec(arr[i]);
                            directPic = directPic.replace(arr[i], "<img src='" + s[1] + "' width='100%'/>");
                        }
                    }
                    //判断该商品分类是否有分类限制
                    var cid = product.get('cid');
                    var limitClassify = {};
                    if(JSON.stringify(global.initData.limitClassify)!='{}'){
                        var limit = global.initData.limitClassify ;
                        if(limit.hasOwnProperty(cid)){
                            //判断cid是否相同。如果相同，则表示存在。否则退出
                            //读取相对应的限制条件
                            limitClassify = limit[cid];
                        }
                     }
                    callback(null,{product:product,picurlarray:picurlarray,directPic:directPic,spec:spec,limitClassify:JSON.stringify(limitClassify)});
                }).catch(function(err){
                    //TODO:错误的处理
                    callback(err);
                });
            },
            //判断商品是否有活动，根据规格id，pid，cid判断
            checkActivity:['getProDetail',function(callback,results){
                var spec = results.getProDetail.product.get('spec');
                var cid = results.getProDetail.product.get('cid');
                var pid = results.getProDetail.product.id;

                async.eachOfSeries(spec,function(value,key,callback1){
                    commonM.getLimitCondition(key,pid,cid,userid).then(function(res){
                        //向规格中追加字段
                        spec[key]['finalResult']=JSON.stringify(res.finalResult);
                        callback1(null,spec);
                    }).catch(function(err){
                        logger.error(err);
                        return ;
                    });
                },function(){
                    //console.log(spec);
                    callback(null, spec);
                });
            }],
        },function(err,results){
            if(err){
                //TODO:
                logger.error(err);
                return;
            }
            //res.send('111');//直接把内容输出给浏览器
            res.render('product/detail',{title:results.getProDetail.product.get('name'),product:results.getProDetail.product,picurlarray:results.getProDetail.picurlarray,directPic:results.getProDetail.directPic,spec:results.checkActivity,isCollected:results.isCollect,cartAllNumber:results.getCountOfCart,seckill:results.isActivity,isOnSale:results.isOnSale,limitClassify:results.getProDetail.limitClassify});
        });
    },
    /**
     * 添加收藏和取消收藏，需要传入
     * Created by Nicolas at 2015-08-19
     * @param req
     * @param res
     * @param next
     */
    //添加收藏/取消收藏
    addUserCollect:function(req,res,next){
        //传递商品ID和userid
        //根据商品ID和userid到收藏表中查找，如果存在，则修改状态，如果不存在，则添加一条记录（收藏）
        var pid = req.query.pid;
        //var uid = req.session.current_user.id;
        var uid = req.AV.user.id;//'test';
        //console.log(pid);
        //res.json({code:0});
        UserCollectM.setUserCollectByUid(uid,pid).then(function(obj){
            res.json(obj);   //设置为弹出框，提示收藏成功，2秒后消失，并且修改收藏按钮的状态
        }).catch(function(err){
            //收藏失败
            res.json(err);   //设置为弹出框，提示收藏失败，2秒后消失
        });
    },
    /**
     * 添加商品到购物车，需要传入商品id和用户id和规格id，购买数量  James modify 16-03-09
     * Created by Nicolas at 2015-08-19
     * @param req
     * @param res
     * @param next
     */
    addToCart:function(req,res,next){
        console.log("进来了，加入购物车操作哦");
        //pid,psid,num,uid
        var pid = req.query.pid;
        var psid = req.query.psid;
        var num = req.query.num;
        //var uid = req.session.current_user.id;
        var uid = req.AV.user.id;//'test';;
        //console.log(uid);
        async.waterfall([
            //插入购物车之前判断库存是否充足
            //function(callback){
            //    ProM.getInventory(pid,psid).then(function(inventory){
            //        if(parseInt(inventory.inventory)<1){
            //            callback({code:-1,inventory:0});
            //        }
            //        if((parseInt(inventory.inventory)-parseInt(num)) < 0){
            //            num = inventory.inventory;
            //        }
            //        callback(null, num);
            //    });
            //},
            function(callback){
                console.log("进入到流水里了哦");
                CartM.insertProToCart(pid,psid,num,uid).then(function(cartPro){
                    callback(null);
                }).catch(function(err){
                    callback({code:err.code,reason:err.reason});
                });
            }
            //,
            ////减库存
            //function(callback){
            //    ProM.updateInventory(pid,psid,parseInt(0-parseInt(num))).then(function(newInventory){
            //        newInventory.number=num;
            //        callback(null,newInventory);
            //    }).catch(function(err){
            //        callback({code:err.code,reason:err.reason});
            //    });
            //}
        ],function(err,result){

            if(err){
                console.log("报错了");
                console.log(err);
                res.json({code:259,reason:err});
            }else{
                res.json(result);
            }
        });

    },
    /**
     * 立即结算，需要传入参数：商品id，规格id，购买数量，用户id  James modify 16-03-09
     * Created by Nicolas at 2015-08-19
     * @param req
     * @param res
     * @param next
     */
    accountNow:function(req,res,next){
        var pid = req.query.pid;
        var psid = req.query.psid;
        var num = req.query.num;
        var cart = req.query.cart;
        //var uid = req.session.current_user.id;
        var uid = req.AV.user.id;//'test';;
        //首先要将该商品加入购物车
        async.waterfall([
            function(callback){
                var mold = "0"; // 普通商品
                //console.log(typeof(cart));
                if(parseInt(cart) === 0){
                    mold ="4" ;  //活动商品
                }
                //console.log("mold:"+mold);
                CartM.insertProToCart(pid,psid,num,uid,mold,cart).then(function(addSuccess){
                     //添加购物车成功
                     callback(null, addSuccess);
                }).catch(function(err){
                    callback({code:257,reason:err});
                });
            },
            //添加完成后减库存
            //减库存
            //function(addSuccess,numbser,callback){
            //    ProM.updateInventory(pid,psid,parseInt(0-parseInt(numbser))).then(function(newInventory){
            //        callback(null,addSuccess);
            //    }).catch(function(err){
            //        callback({code:err.code,reason:err.reason});
            //    });
            //},
            function(addSuccess,callback){
                if(addSuccess.code === 0){
                    var objectid = addSuccess.objectId;
                    //console.log(addSuccess.objectId);
                    CartM.setSingleProductChecked(objectid,uid).then(function(order){
                        callback(null, {code:0,cartProductID:addSuccess.objectId});
                    }).catch(function(err){
                        callback({code:258,reason:err});
                    });
                }
            }
        ],function(err,result){
            if(err){
                res.json({code:259,reason:err});
            }else{
                res.json(result);
            }
        });
        //再执行方法：立即购买，将购物车内其他商品的checked状态变为false
        //最后通过购物车内方法生成订单
    },
    //获取评论列表
    getAllComment:function(req,res,next){
        var pid = req.query.pid;
        var page = req.query.page;
        var limit = req.query.limit;
        Comment.getListOfEvaluation(pid,page,limit).then(function(comment){
            var allComment = [];
            for(var index in comment){
                //console.log(new Date(comment[index].createdAt));
                var time = new Date(comment[index].createdAt);
                var now = new Date();
                var date=now-time;
                var days = Math.floor(date/(24*3600*1000));
                var month =parseInt( days/30) ;
                var years =parseInt( month/12);
                var hours = days%(24*3600*1000);
                var minutes = hours%(3600*1000);
                var second = minutes%(60*1000) ;
                //comment[index].set('dates',hours);
                comment[index].set('dates',(years!=0?years+'年前':month!=0?month+'月前':days!=0?days+'天前':hours!=0?hours+'小时前':minutes!=0?minutes+'分钟前':'刚刚'));
                comment[index].set('username',(comment[index].get('username'))?comment[index].get('username').length ==1?comment[index].get('username').substr(0,1)+'**':comment[index].get('username').substr(0,1)!='*'?comment[index].get('username').substr(0,1)+'**':'shibai':"匿名用户"); //.username=(comment[index].get('username'))?(comment[index].get('username').substr(0,comment[index].get('username').length-2) + "**"):"匿名用户";
                comment[index].set('content',(comment[index].get('content')!="")?comment[index].get('content'):"好评");//.content=(comment[index].get('content')!="")?comment[index].get('content'):"好评";
                comment[index].set('replycontent',comment[index].get('replycontent'));
                allComment.push(comment[index]);
            }
            res.json({code:0,list:allComment});
        }).catch(function(err){
                //TODO:错误的处理
                res.json({code:0,list:[]});
        });
    },
    common:function(req,res,next){
        commonM.getLimitCondition('70','55',158).then(function(mm){
            //console.log(mm);
            res.json(mm)
        }).catch(function(err){
            res.json(err)
        });
    },

};
